#pragma once

#include <pthread.h>
#include "ShmMutex.hpp"

// 作用域锁，用于自动管理锁的生命周期
class ShmScopedLock
{
public:
    // 构造函数，接受 pthread_mutex_t* 类型的锁
    ShmScopedLock(pthread_mutex_t& mutex)
        : _mutex(&mutex), _shmMutex(nullptr) {
        if (_mutex)
            pthread_mutex_lock(_mutex);
    }

    // 构造函数，接受 ShmMutex* 类型的锁
    ShmScopedLock(ShmMutex& shmMutex)
        : _mutex(nullptr), _shmMutex(&shmMutex) {
        if (_shmMutex)
            _shmMutex->Lock();
    }

    // 析构函数，根据成员变量是否为空进行解锁操作
    ~ShmScopedLock() {
        if (_mutex)
            pthread_mutex_unlock(_mutex);
        if (_shmMutex)
            _shmMutex->UnLock();
    }

    // 禁止拷贝构造
    ShmScopedLock(const ShmScopedLock&) = delete;

    // 禁止赋值运算符
    ShmScopedLock& operator=(const ShmScopedLock&) = delete;

private:
    pthread_mutex_t* _mutex; // 普通的 pthread_mutex_t* 类型锁
    ShmMutex* _shmMutex;     // 封装的 ShmMutex 类型锁
};